package com.sgq.vue.redis;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @author: 83778
 * @date: 2023-12-24 18:14
 * @desc:
 */
public interface RedisService {

    /**
     * 普通类型String 推送
     *
     * @param var1
     * @param var2
     */
    <V> void put(String var1, V var2, Long expireTime, final TimeUnit unit);

    /**
     * String类型key 推送
     *
     * @param var1
     * @param var2
     */
    <V> void put(String var1, V var2);

    /**
     * String类型key 获取
     *
     * @param key   key
     * @param clazz 对象r
     */
    <V> V get(String key, Class<V> clazz);


    /**
     * set数据读取一次读一个
     *
     * @param key
     * @param aClass
     * @return
     */
    <V> V setPop(String key, Class<V> aClass);

    /**
     * set数据添加（批量）
     *
     * @param key
     * @param clazz
     * @return
     */
    <V> Long setAddList(String key, List<V> clazz);

    /**
     * set数据添加
     *
     * @param key
     * @param clazz
     * @return
     */
    <V> Long setAdd(String key, V clazz);


    /**
     * LIST 左推数据
     *
     * @param key
     * @param clazz
     * @return
     */
    <V> Long listLeftPush(String key, V clazz);

    /**
     * redis-set数据左读取，一次读一个
     *
     * @param key
     * @param clazz
     * @return
     */
    <V> V listLeftPop(String key, Class<V> clazz);

    /**
     * LIST 右推数据
     *
     * @param key   键
     * @param clazz 对象
     * @return 影响条数
     */
    <V> Long lRightPush(String key, V clazz);

    /**
     * LIST 右读数据
     *
     * @param key   键
     * @param clazz 对象
     * @return 反系列化对象
     */
    <V> V lRightPop(String key, Class<V> clazz);

    /**
     * 判断list数量
     *
     * @param key
     * @return
     */
    <V> Long length(String key);

    /**
     * list类型数据查询 全量
     *
     * @param key
     * @param var2
     * @return
     */
    <V> List<V> getList(String key, Class<V> var2);

    /**
     * list类型数据查询 指定区间
     *
     * @param key   key
     * @param start 开始
     * @param end   结束
     * @param clazz
     * @return
     */
    <V> List<V> getList(String key, int start, int end, Class<V> clazz);

    /**
     * 根据key查询hash类 所有数据
     *
     * @param mainKey
     * @param clazz
     * @return
     */
    <V> Map<String, V> hGetAll(String mainKey, Class<V> clazz);

    /**
     * 根据key-key精准查询hash类数据
     *
     * @param mainKey redis主key
     * @param field   副键
     * @param clazz   对象类型
     * @return
     */
    <V> V hGet(String mainKey, String field, Class<V> clazz);

    /**
     * 利用双key往hashMap添加数据
     *
     * @param key
     * @param field
     * @param var3
     */
    <V> void hPut(String key, String field, V var3);

    /**
     * 批量往hashMap添加数据
     *
     * @param key
     * @param var3
     * @param
     */
    <V> void hPutAll(String key, Map<String, V> var3);

    /**
     * 根据key获取hash所有value值 返回list
     *
     * @param key
     * @return
     * @Author: chenzumao
     */
    <V> List<V> hGetAllToList(String key, Class<V> clazz);

    /**
     * 删除hash指定数据
     *
     * @param key   key
     * @param field field
     */
    <V> void hDel(String key, String field);

    /**
     * 根据key和多个field获取hash相应的value值 返回list
     *
     * @param key    主键key
     * @param fields 批量获取的副键
     * @param clazz  类
     * @return 集合
     * @Author: chenzumao
     */
    <V> List<V> hGetAllToList(String key, Collection<String> fields, Class<V> clazz);


    /**
     * 危险操作-删除该key所有数据
     *
     * @param key
     * @return
     */
    <V> Long delKey(String key);
}
